package Thread;

/*同步块
有效的缩小同步范围可以在保证并发安全的同
时尽可能提高并发效率*/

public class SynchronizedDemo2 {
    public static void main(String[] args) {
        Shop shop=new Shop();
        Thread thread=new Thread(){
            public void run(){
                shop.buy();
            }
        };

        Thread thread1=new Thread(){
            public void run(){
                shop.buy();
            }
        };
        thread.start();
        thread1.start();
    }
}

class Shop{
    public void buy(){
        Thread thread=Thread.currentThread();
        try {
            System.out.println(thread.getName()+"正在买衣服");
            Thread.sleep(5000);

//            同步块可以要求多个线程对该块内的代码
//            排队执行,但是前提条件是同步监视器对象
//            即(上锁的对象)要求多个线程看到的必须是
//            同一个。  这里this指的是 shop对象
//            synchronized(同步监视器对象){
//                需要同步的代码
//            }
//            所谓同步执行即:多个线程必须排队执行
//            所谓异步执行即:多个线程可以同时执行

            synchronized(this){
                System.out.println(thread.getName()+"正在试衣服");
                Thread.sleep(5000);
            }
            System.out.println(thread.getName()+"结账离开");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}
